﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using Maestro_Proveedores;

namespace Maestro_Proveedores.Forms
{
    public partial class CargarFormularios : Form
    {
        /// <summary>
        /// <para>Este formulario inicializa y registra todos los formularios (Previamenet registrados en el metodo cargarFormularios_Shown(object sender, EventArgs e)) en la clase Redirect.</para>
        /// <para>Este metodo mejora considerablemente el rendimiento del aplicativo en cuanto a la inicializacion de los formularios.</para>
        /// </summary>
        public CargarFormularios()
        {
            InitializeComponent();
        }

        private Auditoria.CORPORATIVADataSetTableAdapters.SEG_PERMISOSTableAdapter sEG_PERMISOSTableAdapter = new Auditoria.CORPORATIVADataSetTableAdapters.SEG_PERMISOSTableAdapter();
        private Auditoria.CORPORATIVADataSet aUDITORIADataSet = new Auditoria.CORPORATIVADataSet();
        
        
        private void cargarFormularios_Shown(object sender, EventArgs e)
        {
            
                Cursor.Current = Cursors.WaitCursor;
                                
                ArrayList formularios = new ArrayList();
                String formu = "";
                bool ok=false;
                bool isEmergente = false;
                Type tipo;

                try
                {
                    formularios.Add("CertificarProveedor");
                    formularios.Add("GenerarCertificados");
                    formularios.Add("CalificacionFinanciera");
                    formularios.Add("CalificacionJuridica");
                    formularios.Add("ClasificacionBienesServicios");
                    formularios.Add("Mantenimiento");
                    formularios.Add("RegistrarProveedor");
                    formularios.Add("HorasHombre");
                    formularios.Add("Accidentes");
                    formularios.Add("DesarrolloProveedores");
                    formularios.Add("RealizarEvaluacionDeDesempeno");
                    formularios.Add("Reclamos");
                    formularios.Add("ConsultarProveedor");
                    formularios.Add("ConsultarRechazos");
                    formularios.Add("ConsultarDevoluciones");
                    formularios.Add("ConsultarFacProveedor");
                    formularios.Add("RegistrarRechazos");
                    formularios.Add("ConsultarOrdenesCompra");
                    formularios.Add("EvaluarProveedor");
                    formularios.Add("EjecutarScript"); 
                    formularios.Add("ConsultarAuditoria");
                    formularios.Add("ConsultarIniciosDeSesion");
                    formularios.Add("FormReport_ReclamoAProveedores");  //---reporte
                    formularios.Add("FormReport_EvalServicio");         //---reporte
                    formularios.Add("FormReport_evalDesempeno");        //---reporte
                    formularios.Add("FormReport_evalDesempenoServicio");  //---reporte
                    formularios.Add("FormReport_CertificacionInterna"); //---reporte
                    formularios.Add("DetallesProveedor");   //--- este formulario es emergente, pero lo cargo en esta parte por que es muy pesado y demora mucho al abrir.
                    formularios.Add("BuscarProveedor");     //--- este formulario es emergente, pero lo cargo en esta parte por que debo conservar el objeto ya que es un formulario de busqueda.
                    formularios.Add("Parametros");          //--- este formulario es emergente, pero lo cargo en esta parte por que debo conservar el objeto ya que es un formulario de busqueda.
                    formularios.Add("ModificacionesAdmon");

                    this.progressBar1.Maximum = formularios.Count;
                    this.progressBar1.Step = 1;

                    foreach (String form in formularios)
                    {
                        //-- creo una instancia del formulario.
                        Assembly ensamblado = System.Reflection.Assembly.LoadFrom(Application.ExecutablePath); //si es la aplicacion en curso
                        tipo = ensamblado.GetType("Maestro_Proveedores.Forms." + form);
                        ok = false;
                        isEmergente = false;
                        try
                        {
                            //if (tipo.Name == "ModificacionesAdmon")
                            //    MessageBox.Show("emtr");
                            //--el que no tenga el campo TIPO, implica que sea un formulario emergente.
                            if (tipo.GetField("TIPO") == null)
                            {
                                ok = true;
                                isEmergente = true;
                               // MessageBox.Show(form);
                            }
                            else
                            {
                                //-- capturo el tipo, en caso de que se presente una excepcion, tonces no cargo el formulario.
                                if (this.sEG_PERMISOSTableAdapter.FillByTipoGrupo(this.aUDITORIADataSet.SEG_PERMISOS, tipo.GetField("TIPO").GetValue("TIPO").ToString() + Session.Seg_USUARRow.CODGRU) > 0)
                                    ok = this.aUDITORIADataSet.SEG_PERMISOS[0].INGRESAR;                                    
                            }

                        }
                        catch (Exception ex)
                        {
                            ok = false;
                            herramientas.MessageException.show(ex);
                        }

                        //-- Solo cargo aquellos formularios a los que el usuario que ingreso tiene permisos para acceder (Esto implica ahorro de tiempo y de RAM)
                        if (ok)
                        {    
                            Form temp = ((Form)(Activator.CreateInstance(tipo)));
                            //--- cambio algunas propiedades de los formularios, solo de aquellos que no sean Formularios emergentes.
                            if (!isEmergente)
                            {
                                temp.BackColor = global::Maestro_Proveedores.Properties.Settings.Default.blanco;
                                temp.ShowIcon = global::Maestro_Proveedores.Properties.Settings.Default.noShowIcon;
                                temp.WindowState = FormWindowState.Maximized;
                                temp.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
                                temp.Text = global::Maestro_Proveedores.Properties.Settings.Default.maestro_proveedores;
                            }
                            Maestro_Proveedores.herramientas.Redirect.addNewForm(temp, isEmergente);
                            this.progressBar1.PerformStep();
                            formu = "Maestro_Proveedores.Forms." + form;
                        }
                    }
                    Cursor.Current = Cursors.Default;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ultimo formulario cargado con exito: " + formu);
                    Maestro_Proveedores.herramientas.MessageException.show(ex);
                    Maestro_Proveedores.herramientas.Redirect.closeAllForms();
                }
            this.Close();                            
        }

        private void CargarFormularios_Load(object sender, EventArgs e)
        {

        }
    }
}
